package com.z.system.utils;

import java.util.List;

/**
 * 通用分页返回实体
 * 用于封装分页查询结果，供各个模块使用
 */
public class PageResult<T> {
    
    /**
     * 数据列表
     */
    private List<T> records;
    
    /**
     * 当前页码（从1开始）
     */
    private Integer current;
    
    /**
     * 每页大小
     */
    private Integer size;
    
    /**
     * 总记录数
     */
    private Long total;
    
    /**
     * 总页数
     */
    private Integer pages;
    
    /**
     * 无参构造方法
     */
    public PageResult() {
    }
    
    /**
     * 构造方法
     * 
     * @param records 数据列表
     * @param current 当前页码（从1开始）
     * @param size 每页大小
     * @param total 总记录数
     */
    public PageResult(List<T> records, Integer current, Integer size, Long total) {
        this.records = records;
        this.current = current;
        this.size = size;
        this.total = total;
        // 计算总页数
        this.pages = total == 0 ? 1 : (int) Math.ceil((double) total / size);
    }
    
    /**
     * 从Spring Data JPA的Page对象创建PageResult
     * 
     * @param page Spring Data JPA的Page对象
     * @param <T> 数据类型
     * @return PageResult对象
     */
    public static <T> PageResult<T> from(org.springframework.data.domain.Page<T> page) {
        // 注意：Spring Data JPA的page.getNumber()是从0开始的，需要加1
        return new PageResult<>(
                page.getContent(),
                page.getNumber() + 1,
                page.getSize(),
                page.getTotalElements()
        );
    }
    
    /**
     * 获取数据列表
     * 
     * @return 数据列表
     */
    public List<T> getRecords() {
        return records;
    }
    
    /**
     * 设置数据列表
     * 
     * @param records 数据列表
     */
    public void setRecords(List<T> records) {
        this.records = records;
    }
    
    /**
     * 获取当前页码
     * 
     * @return 当前页码
     */
    public Integer getCurrent() {
        return current;
    }
    
    /**
     * 设置当前页码
     * 
     * @param current 当前页码
     */
    public void setCurrent(Integer current) {
        this.current = current;
    }
    
    /**
     * 获取每页大小
     * 
     * @return 每页大小
     */
    public Integer getSize() {
        return size;
    }
    
    /**
     * 设置每页大小
     * 
     * @param size 每页大小
     */
    public void setSize(Integer size) {
        this.size = size;
    }
    
    /**
     * 获取总记录数
     * 
     * @return 总记录数
     */
    public Long getTotal() {
        return total;
    }
    
    /**
     * 设置总记录数
     * 
     * @param total 总记录数
     */
    public void setTotal(Long total) {
        this.total = total;
        // 重新计算总页数
        this.pages = total == 0 ? 1 : (int) Math.ceil((double) total / this.size);
    }
    
    /**
     * 获取总页数
     * 
     * @return 总页数
     */
    public Integer getPages() {
        return pages;
    }
    
    /**
     * 设置总页数
     * 
     * @param pages 总页数
     */
    public void setPages(Integer pages) {
        this.pages = pages;
    }
}